package com.af.system.tree;

import java.util.ArrayList;
import java.util.List;

/**
 * @author : zhenyun.su
 * @since : 2023/3/22
 * @commit: 将包含Id, Pid的List转换为树形结构一组数据。
 */

public class AfTreeUtils {
    // 叶子节点id
    public static List<Long> leafNodeIds = new ArrayList<>();

    /*
     * @comment : 通过rootId来获取根节点， 一般0或null为更节点
     */
    public static <T extends AfNodeable> List<T> buildTree(List<T> sources, Long rootId){
        leafNodeIds.clear();
        // 获取根节点
        List<T> rootNodes= findChildNodes(sources,rootId);
        for (T rootNode : rootNodes) {
            addChildren(sources, rootNode);
        }
        return rootNodes;
    }

    /*
     * @comment : 通过递归方式，从sources获取child节点放入node
     */
    private static <T extends AfNodeable> void addChildren(List<T> sources, T node){
        List<T> childNodes= findChildNodes(sources, node.getId());
        if (childNodes.size() >= 1){
            node.setChildren(childNodes);
            for (T childNode : childNodes) {
                addChildren(sources, childNode);
            }
        }else{
            node.setLeafed(true);
            leafNodeIds.add(node.getId());
        }
    }

    /*
     * @comment : 根据pid，获取AuthMenu
     */
    public static <T extends AfNodeable> List<T> findChildNodes(List<T> sources, Long Pid){
        List<T> childNodes= new ArrayList<>();
        for (T treeNode : sources) {
            if (Pid.equals(treeNode.getPid())){
                childNodes.add(treeNode);
            }
        }
        return childNodes;
    }
}
